﻿#ifndef _CELL_FDSET_HPP_
#define _CELL_FDSET_HPP_

#include "CELL.h"
#include <memory.h>

class CELLFDSet
{
public:
	CELLFDSet()
	{
		int nSocketNum = 10240;
#ifdef _WIN32
		_nfdSzie = sizeof(u_int) + sizeof(SOCKET) * nSocketNum;
#else
		_nfdSzie = nSocketNum / (8 * sizeof(char));
#endif // #ifdef _WIN32
		_pfdset = (fd_set*)new char[_nfdSzie];
		memset(_pfdset, 0, _nfdSzie);
	}

	~CELLFDSet()
	{
		if (_pfdset)
		{
			delete[] _pfdset;
			_pfdset = nullptr;
		}
	}

	inline void add(SOCKET s)
	{
		if (_pfdset)
		{
			FD_SET(s, _pfdset);
		}
	}

	inline void del(SOCKET s)
	{
		FD_CLR(s, _pfdset);
	}

	inline void zero()
	{
#ifdef _WIN32
		FD_ZERO(_pfdset); // windows上的FD_ZERO比memset效率高
#else
		memset(_pfdset, 0, _nfdSzie);
#endif // #ifdef _WIN32
	}

	inline bool has(SOCKET s)
	{
		return FD_ISSET(s, _pfdset);
	}

	inline fd_set* fdset()
	{
		return _pfdset;
	}

	void copy(CELLFDSet& set)
	{
		// 如果大小不对等会出错
		memcpy(_pfdset, set.fdset(), set._nfdSzie);
	}
private:
	fd_set* _pfdset = nullptr;
	size_t _nfdSzie = 0;
};

#endif // #ifndef _CELL_FDSET_HPP_
